/**
 * @file Timer.h
 * @author huangxiaozhu (xiaozhuhuang2014@163.com)
 * @brief  定时器
 * @version 1.0.0
 * @date 2024-02-26
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#pragma once

#include <tools/ThreadObj/ThreadObj.h>
#include <atomic>
#include <functional>
#include <unordered_map>

const static int DEFAULT_TIME_INTERVAL = 5;     // 默认单次轮询间隔时间5毫秒
const static int MIN_TIME_INTERVAL = 1;         // 最小的时间间隔，小于这个时间间隔不能启动此timer

using TimerHadleFunc = std::function<void()>;

struct TimerData
{
    std::string id;             // 定时器id 
    TimerHadleFunc func;        // 处理函数
    int timeInterval;           // 响应的时间间隔
    int countl = 0;             // 计数器
};


class Timer : public ThreadObj
{
public:
    Timer(int timeInterval = DEFAULT_TIME_INTERVAL);
    ~Timer();

    bool UpdateSysTimeInterval(int timeInterval);               // 更新系统的间隔时间

    bool AddTimer(TimerData timerData);
    bool UpdateTimer(const std::string& id, int timeInterval);  // 更新单个任务时间间隔
    bool RemoveTimer(const std::string& id);
    void RemoveAllTimer();

protected:
    virtual int DoTask() override;                              // 线程任务
    void HandleTimer();
    
    virtual bool IsLegalTimeInterval(int timeInterval);         // 判断时间间隔是否合法，使用虚函数，方便后续的单元测试中使用mock

private:
    bool m_beStop = false;
    ThreadCond m_cond;                                          // 用于等待时间，同时提供退出的条件变量
    std::atomic_int m_timeInterval{DEFAULT_TIME_INTERVAL};      // 时间间隔
    
    std::mutex m_mutex;                                         // Map互斥锁
    std::unordered_map<std::string, TimerData> m_timerDataMap;  // 定时器处理对象数据
};